﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Fuyao.Business.Entities.Models;
using Fuyao.Business.Logic.BC;
using Fuyao.Win.UI.Util;
using Fuyao.Win.UI.Common;
using Fuyao.Win.UI.Mantenimientos;
using Fuyao.Win.UI.Reportes;

namespace Fuyao.Win.UI.Ventas
{
    public partial class frmOrdenCompra : Form
    {
        BusinessLogic bc = new BusinessLogic();
        private int currentIndex = -1;
      
        #region Propiedades       
        public bool action { get; set; }
        public Pedido bePedido { get; set; }
        public Cliente beCliente { get; set; }
        public int PedidoID { get; set; }
        private bool _flagEstadoGuia;
        #endregion

        public frmOrdenCompra()
        {
            InitializeComponent();
        }

        private void frmOrdenCompra_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.cerrarFormularioEscape(e, this);
        }     
 
        private void cargarDatosCliente(Cliente oCliente)
        {
            txtRazonSocial.Text = oCliente.NombreCliente;
            txtRazonSocial.Tag = oCliente.ClienteID;
            txtRuc.Text = oCliente.RUC;
            txtDni.Text = oCliente.DNI;
            txtDireccion.Text = oCliente.Direccion;
            txtTelefono.Text = oCliente.Telefono;
            this.btnAgregar.Focus();
        }

        private void txt_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            ErrorProv.SetError(tbx, "");
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            frmSelectProductos frm = new frmSelectProductos();
            frm.ShowDialog();

            if (frm.ProductoSeleccionado != null)
            {
                if (bePedido.DetallePedidos.Count == 0) bePedido.DetallePedidos = new List<DetallePedido>();
                if (!validaExisteProdenDetalle(frm.ProductoSeleccionado.ProductoID))
                {
                    DetallePedido oDetallePedido = new DetallePedido();
                    oDetallePedido.CodigoProducto = frm.ProductoSeleccionado.CodigoProducto;
                    oDetallePedido.DescripcionProducto = frm.ProductoSeleccionado.DescripcionProducto;
                    oDetallePedido.PrecioUnitario = frm.ProductoSeleccionado.Precio;
                    oDetallePedido.Cantidad = 0;
                    oDetallePedido.ProductoID = frm.ProductoSeleccionado.ProductoID;

                    bePedido.DetallePedidos.Add(oDetallePedido);
                    dgvDetalles.DataSource = null;
                    dgvDetalles.DataSource = bePedido.DetallePedidos;
                    this.dgvDetalles.ClearSelection();
                    currentIndex = dgvDetalles.Rows.Count - 1;
                    this.dgvDetalles.CurrentCell = dgvDetalles.Rows[currentIndex].Cells[colCantidad.Index];
                }               
            }
        }

        private bool validaExisteProdenDetalle(int ProductoID)
        {
            foreach (DetallePedido beDetPed in bePedido.DetallePedidos)
            {
                if (beDetPed.ProductoID == ProductoID)
                {
                    MessageBox.Show("El producto ya se encuentra agregado en el detalle", "Sistema FUYAO - Validando Opción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return true;
                }
            }
            return false;
        }

        private void frmOrdenCompra_Load(object sender, EventArgs e)
        {
            loadUI();
        }

        private void loadUI()
        {
            loadDefaultInformation();
            if (PedidoID == 0) newPedido();
            else editPedido();
        }

        private void loadDefaultInformation()
        {
            action = false;
            this.txtRazonSocial.Focus();
            this.txtNroGuiaInterna.Text = bc.getNumeroGuia(Constantes.PARAMETRO_NumeroGuiaInterna);
            this.txtManejadoPor.Text = VariablesGlobales.GlobalEnUsuario.Nombre + " " + VariablesGlobales.GlobalEnUsuario.ApellidoPaterno /*+ " " + VariablesGlobales.GlobalEnUsuario.ApellidoMaterno*/;
            this.txtManejadoPor.BackColor = Color.White;
            Utilitarios.cargarCboEstadosParametrosTable(this.cboEstadoGuiaInterna, Constantes.PARAMETRO_GuiaInterna);
            this.cboEstadoGuiaInterna.SelectedIndex = 0;
            Utilitarios.configurarGrilla(ref dgvDetalles);
            setColumnasGrilla();
            if (PedidoID == 0)
            {
                this.cboEstadoGuiaInterna.Enabled = false;
                this.Text = "NUEVA GUÍA INTERNA";
            }
            else
            {
                this.cboEstadoGuiaInterna.Enabled = true;
                this.Text = "CAMBIAR ESTADO GUÍA INTERNA";
            }
        }

        private void editPedido()
        {
            bePedido = bc.getGuiaInternaByPedidoID(PedidoID);
            cargarDatosGuiaInterna(bePedido);
            deshabilitaBotones(false);
            this.dgvDetalles.Enabled = false;
            _flagEstadoGuia = true; 
        }

        private void newPedido()
        {
            bePedido = new Pedido();
            bePedido.DetallePedidos = new List<DetallePedido>();
            bePedido.Estado = Constantes.GUIAINTERNA_CREADO;
            bePedido.CreadoPor = VariablesGlobales.GlobalEnUsuario.UsuarioID;
        }

        private void deshabilitaBotones(bool _val)
        {
            this.btnAgregar.Enabled = _val;
            this.btnQuitar.Enabled = _val;
            this.txtObservacion.Enabled = _val;
            this.txtObservacion.BackColor = Color.White;
            foreach (Control c in groupBox1.Controls)
            {
                if (c is TextBox)
                {
                    ((TextBox)c).ReadOnly = true;
                    ((TextBox)c).BackColor = Color.White;
                }
            }
        }

        private void cargarDatosGuiaInterna(Pedido Pedido)
        {
            this.txtNroGuiaInterna.Text = Pedido.NroPedidoDesc;
            this.txtNroGuiaInterna.Tag = Pedido.PedidoID;
            this.txtRazonSocial.Text = Pedido.NombreCliente;
            this.txtRuc.Text = Pedido.RucCliente;
            this.txtDni.Text = Pedido.DniCliente;
            this.txtDireccion.Text = Pedido.DireccionCliente;
            this.txtTelefono.Text = Pedido.TelefonoCliente;
            this.txtManejadoPor.Text = Pedido.ManejadoPor;
            this.txtObservacion.Text = Pedido.Observacion;
            if (Pedido.Estado == Constantes.GUIAINTERNA_ANULADO)
            {
                _flagEstadoGuia = false;//TRUE
                this.cboEstadoGuiaInterna.Enabled = false;
            }
            else
            {
                _flagEstadoGuia = true;
                this.cboEstadoGuiaInterna.Enabled = true;
            }
            this.cboEstadoGuiaInterna.SelectedValue = Pedido.Estado.ToString();
            this.dgvDetalles.DataSource = null;
            this.dgvDetalles.DataSource = Pedido.DetallePedidos;
        }

        private void setColumnasGrilla()
        {
            colProducto.DataPropertyName = "CodigoProducto";
            colDescripcion.DataPropertyName = "DescripcionProducto";
            colCantidad.DataPropertyName = "Cantidad";
            colPrecio.DataPropertyName = "PrecioUnitario";
            colImporte.DataPropertyName = "Importe";
        }

        private void dgvDetalles_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            if (e.ColumnIndex == colProducto.Index || e.ColumnIndex == colDescripcion.Index || 
                /*e.ColumnIndex == colPrecio.Index ||*/ e.ColumnIndex == colImporte.Index)
                e.Cancel = true;
        }
        #region Antes
        /*private void dgvDetalles_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsNumber(e.KeyChar) || e.KeyChar == (Char)Keys.Back) e.Handled = false;
            else e.Handled = true;                
        }

        private void dgvDetalles_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            if (dgvDetalles.CurrentCell.ColumnIndex == colCantidad.Index || dgvDetalles.CurrentCell.ColumnIndex == colPrecio.Index)
            {
                TextBox txt = e.Control as TextBox;
                if (txt != null) txt.KeyPress += new KeyPressEventHandler(dgvDetalles_KeyPress);              
            }
        }*/
        #endregion

        private void dgvDetalles_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvDetalles[colCantidad.Index, e.RowIndex].Value == null) dgvDetalles[colCantidad.Index, e.RowIndex].Value = 0;
            if (dgvDetalles[colPrecio.Index, e.RowIndex].Value == null) dgvDetalles[colPrecio.Index, e.RowIndex].Value = Convert.ToDecimal(0);
            dgvDetalles[colPrecio.Index, e.RowIndex].Value = Utilitarios.FormatoPrecio(Convert.ToDouble(dgvDetalles[colPrecio.Index, e.RowIndex].Value));
            dgvDetalles[colImporte.Index, e.RowIndex].Value = Convert.ToInt32(dgvDetalles[colCantidad.Index, e.RowIndex].Value) * Convert.ToDecimal(dgvDetalles[colPrecio.Index, e.RowIndex].Value);
            this.dgvDetalles.Focus();
        }

        private void dgvDetalles_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {           
            if (dgvDetalles.IsCurrentCellDirty)
            {
                if (e.ColumnIndex == colCantidad.Index || e.ColumnIndex == colPrecio.Index)
                {
                    if (!Utilitarios.IsNumeric(e.FormattedValue))
                    {
                        MessageBox.Show("Ingrese una dato válido o presione ESC", "Sistema FUYAO - Mensaje de Validación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        e.Cancel = true;
                    }
                }
            }
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            if (dgvDetalles.RowCount == 0)
            {
                MessageBox.Show("No existen registros agregados al detalle" , "Sistema FUYAO - Validando Opción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (dgvDetalles.CurrentRow != null) quitarElementoDetalle();
            else
            {
                MessageBox.Show("Seleccione el registro que desee quitar del detalle", "Sistema FUYAO - Validando Opción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }     
        }

        private void quitarElementoDetalle()
        {
            //bePedido.DetallePedidos.Remove((DetallePedido)dgvDetalles.CurrentRow.DataBoundItem);
            bePedido.DetallePedidos.Remove((DetallePedido)dgvDetalles.Rows[currentIndex].DataBoundItem);
            dgvDetalles.DataSource = null;
            dgvDetalles.DataSource = bePedido.DetallePedidos;
            if (dgvDetalles.Rows.Count > 0)
            {
                dgvDetalles.ClearSelection();
                currentIndex = dgvDetalles.Rows.Count - 1;
                this.dgvDetalles.CurrentCell = dgvDetalles.Rows[currentIndex].Cells[colCantidad.Index];
            }
        }

        private Pedido llenarEntidad()
        {
            bePedido.ClienteID = Convert.ToInt32(txtRazonSocial.Tag);
            bePedido.Observacion = txtObservacion.Text.Trim();
            bePedido.NroPedido = (int?)Convert.ToInt32(this.txtNroGuiaInterna.Text);
            bePedido.ManejadoPor = txtManejadoPor.Text.Trim();
            bePedido.CreadoPor = VariablesGlobales.GlobalEnUsuario.UsuarioID;
            /*bePedido.NombreCliente = txtRazonSocial.Text.Trim();
            bePedido.TelefonoCliente = txtTelefono.Text.Trim();
            bePedido.RucCliente = txtRuc.Text.Trim();
            bePedido.DniCliente = txtDni.Text.Trim();
            bePedido.DireccionCliente = txtDireccion.Text.Trim();*/
            return bePedido;
        }  

        private void cerrarForm()
        {
            this.Close();
            action = true;
        }

        private bool validarCamposRequeridos()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Ingrese los campos requeridos: " + System.Environment.NewLine);

            bool isValid = true;

            if (String.IsNullOrEmpty(this.txtNroGuiaInterna.Text) || this.txtNroGuiaInterna.Text == "000000")
            {
                sb.Append("- El número de guía interna no se encuentra cargado");
                ErrorProv.SetError(txtNroGuiaInterna, "Ingrese el número de guía interna");
                isValid = false;
            }

            if (String.IsNullOrEmpty(txtRazonSocial.Text))
            {
                sb.Append("- Razón Social del cliente" + System.Environment.NewLine);
                ErrorProv.SetError(txtRazonSocial, "Ingrese la Razón Social del cliente");
                isValid = false;
            }

            if (dgvDetalles.RowCount == 0)
            {
                sb.Append("- No se agregaron registros al detalle de la guía" + System.Environment.NewLine);
                isValid = false;
            }

            if (!isValid)
                MessageBox.Show(sb.ToString(), "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

            return isValid;
        }

        private void cboEstadoGuiaInterna_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!_flagEstadoGuia) return;
            if (cboEstadoGuiaInterna.SelectedIndex == 1) changeBotonImprimir();//se anula la guia
            else changeBotonGrabar();
        }

        private void changeBotonImprimir()
        {
            this.btnGrabarNewEstado.Visible = true;
            this.btnImprimirDatos.Visible = false;
        }

        private void changeBotonGrabar()
        {
            this.btnGrabarNewEstado.Visible = false;
            this.btnImprimirDatos.Visible = true;
        }

        private void btnImprimirDatos_Click(object sender, EventArgs e)
        {
            if (_flagEstadoGuia) imprimirGuiaOnlyGuia();
            else
            {
                if (validarCamposRequeridos())
                {
                    if (PedidoID == 0) //true:Insert
                    {
                        Venta beVenta = new Venta();
                        beVenta.TipoVenta = Constantes.GUIAINTERNA_CODE;
                        beVenta.NroVenta = Convert.ToInt32(this.txtNroGuiaInterna.Text);
                        if (bc.validarNroDocumento(beVenta))
                        {
                            MessageBox.Show("El nro de guía ya fue ingresado al sistema. Ingrese otro número.", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            txtNroGuiaInterna.Focus();
                            return;
                        }

                        PedidoID = bc.InsertGuiaInterna(llenarEntidad());
                        if (PedidoID > 0)
                        {
                            MessageBox.Show("Se ingresaron los datos correctamente", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            imprimirGuiaOnlyGuia();
                            cerrarForm();
                        }
                        else
                            MessageBox.Show("Error al ingresar los datos, contacte con Sistemas", "Sistema FUYAO - Mensaje de Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
        }

        private void imprimirGuiaOnlyGuia()
        {
            rptGuiaInterna rpt = new rptGuiaInterna();
            DataTable dt = (DataTable)(new Fuyao.Win.UI.Reportes.dsReportesTableAdapters.GuiaInternaTableAdapter().GetGuiaInternaByNroPedido(PedidoID));
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            rpt.Subreports[0].SetDataSource(ds);
            rpt.SetDataSource(ds);
            frmReportViewer frm = new frmReportViewer(rpt);
            frm.ShowDialog();
        }

        private void btnGrabarNewEstado_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Esta seguro que desea anular la guía", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.YesNo,
                    MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                if (bc.UpdateEstadoGuiaInterna(Convert.ToInt32(this.txtNroGuiaInterna.Text), Constantes.GUIAINTERNA_ANULADO, VariablesGlobales.GlobalEnUsuario.UsuarioID))
                {
                    MessageBox.Show("Se actualizó el estado de la guía correctamente", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    cerrarForm();
                }
                else
                    MessageBox.Show("Error al actualizar el estado de la guía, contacte con Sistemas", "Sistema FUYAO - Mensaje de Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
       
        private void txt_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.vSoloNumeros(e);
        }

        private void txtRazonSocial_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                frmSelectCliente frm = new frmSelectCliente();
                frm.txtRazonSocial.Text = this.txtRazonSocial.Text.Trim();
                frm.ShowDialog();

                if (frm.ClienteSeleccionado == null)
                {
                    if (MessageBox.Show("Cliente no existe. Desea crearlo?", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.YesNo,
                        MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    {
                        Mantenimientos.frmClientes frmCliente = new Mantenimientos.frmClientes();
                        frmCliente.ShowDialog();
                        if (frmCliente.action)
                        {
                            beCliente = new Cliente();
                            beCliente = bc.getClienteByClienteID(frmCliente.ClienteID);
                            cargarDatosCliente(beCliente);
                        }
                    }
                    #region Antes deben registrar ellos mismo el cliente
                    /*else
                    {
                        MessageBox.Show("Nuevo cliente se guardara al finalizar la transacción", "Sistema FUYAO - Mensaje de Confirmación",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.txtRazonSocial.Tag = 0;
                    }*/
                    #endregion
                    else
                    {
                        this.txtRazonSocial.SelectAll();
                        return;
                    }
                }
                else cargarDatosCliente(frm.ClienteSeleccionado);
            }
        }

        private void dgvDetalles_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0) currentIndex = this.dgvDetalles.CurrentRow.Index;
        }

        private void txtNroGuiaInterna_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar) || e.KeyChar == Convert.ToChar(Keys.Enter)) e.Handled = false;
            else e.Handled = true;
        }

        private void txtNroGuiaInterna_Leave(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtNroGuiaInterna.Text)) txtNroGuiaInterna.Text = bc.getNumeroGuia(Constantes.PARAMETRO_NumeroGuiaInterna);
            else if (!string.IsNullOrEmpty(txtNroGuiaInterna.Text)) txtNroGuiaInterna.Text = String.Format("{0:000000}", Convert.ToInt32(txtNroGuiaInterna.Text));
            this.txtRazonSocial.Focus();
        }
        
    }
}
